package cn.itsource.hrm.service.impl;

import cn.itsource.hrm.util.UserConstants;
import cn.itsource.hrm.client.RedisClient;
import cn.itsource.hrm.domain.Sso;
import cn.itsource.hrm.mapper.SsoMapper;
import cn.itsource.hrm.service.ISmsCodeService;
import cn.itsource.hrm.util.AjaxResult;
import cn.itsource.hrm.util.SmsUtil;
import cn.itsource.hrm.util.StrUtils;
import cn.itsource.hrm.util.UserType;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class SmsCodeServiceImpl implements ISmsCodeService {


    @Autowired
    private RedisClient redisClient;

    @Autowired
    private SsoMapper ssoMapper;
    @Override
    public AjaxResult sendSmsCode(Map<String, Object> params) {
        String mobile = (String) params.get("mobile");
        String imageCode = (String) params.get("imageCode");
        String imageCodeKey = (String) params.get("imageCodeKey");
        // 1 校验 手机号是否已注册 验证码是否正确
        if (StringUtils.isBlank(mobile)|| StringUtils.isBlank(imageCode)
                ||StringUtils.isBlank(imageCodeKey))
            return AjaxResult.me().setSuccess(false).setMessage("请输入相关参数！");
        String codeOfRedis = redisClient.get(imageCodeKey);
        if (!imageCode.equalsIgnoreCase(codeOfRedis))
            return AjaxResult.me().setSuccess(false).setMessage("请输入正确图形验证码！");
        EntityWrapper<Sso> wrapper = new EntityWrapper<>();
        wrapper.eq("phone",mobile);
        wrapper.eq("userType", UserType.USERTYPE_VIP); //魔鬼数字 同一个手机号可能有两个类型用户（会员，管理员）
        List<Sso> ssos = ssoMapper.selectList(wrapper);
        if (ssos!=null && ssos.size()>0)
            return AjaxResult.me().setSuccess(false).setMessage("该账户已经被注册！");
        // 2 尝试获取验证码，判断是否有效
        String registerCodeKey = UserConstants.REGISTER_CODE_PREFIX + mobile;
        String registerCode = redisClient.get(registerCodeKey);  // code:time
        // 2.1 如果有效，判断是否已过重发时间
        String code = null;
        if (StringUtils.isNotBlank(registerCode)){
           String time =  registerCode.split(":")[1];
            // 2.1.1 如果没有过，返回错误
            if (System.currentTimeMillis()-Long.valueOf(time)<60*1000) {
                return AjaxResult.me().setSuccess(false).setMessage("请稍后再重新发送!");
            }
            // 2.1.2 如果过程，重新记录验证码过期时间，进行发送
            code =  registerCode.split(":")[0];
        }
        //2.2 如果无效 生成验证码，记录验证码，进行发送
        if (code==null)
            code = StrUtils.getComplexRandomString(6);
        //3 记录验证码，进行发送
        Map<String,Object> paramTmp = new HashMap<>();
        paramTmp.put("key",registerCodeKey);
        paramTmp.put("value",code+":"+System.currentTimeMillis());
        paramTmp.put("expire",5*60);
        redisClient.add(paramTmp);
        SmsUtil.sendMsg(mobile,"您的注册验证码为："+code+",请在5分钟之内使用！");
        System.out.println("您的注册验证码为："+code+",请在5分钟之内使用！");
        return AjaxResult.me();
    }
}
